對於工程師來說,127.0.0.1 與 0.0.0.0 這兩個IP地址再熟悉不過了,看起來好像就那麼回事,但真正較起真來,這兩個IP地址到底有什麼作用以及到底有什麼不同?貌似誰可以輕鬆回答,但張嘴卻又不知從何說起...(這要是面試,估計真會被這搞砸...)
本文將系統地總結 127.0.0.1 和 0.0.0.0 這兩個IP地址的作用,以及它們之間的區別,希望能為你解惑。
我們先回顧一下IP地址的基礎知識(本節內容僅作快速概覽,如您對IP地址知識一無所知,建議首先閱讀《IP地址和子網劃分學習筆記之《IP地址詳解》》)。
IP地址由兩個部分組成,net-id 和 host-id,即網絡號
和主機號
:
即:
IP-address ::= { <Network-ID>, <Host-ID>}
就像下圖這樣:
IP地址一共分為5類,即A~E
,它們分類的依據是其 net-id 所佔的字節長度以及網絡號前幾位。
大致分類如下:
其中,A、B、C 三類地址為單播地址
(unicast),用於一對一通信,是最常用的。
IP地址分類看下面這張圖,可能更直接一些:
(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)
這裡還有一張IP地址分類的思維導圖:
(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)
特殊IP地址就是用來做一些特殊的事情。RFC1700中定義了以下特殊IP地址:
{0,0}
: 網絡號和主機號都全部為0,表示"本網絡上的本主機",只能用作源地址。{0,host-id}
: 本網絡上的某台主機。只能用作源地址。{-1,-1}
: 表示網絡號和主機號的所有位上都是 1(二進制),用於本網絡上的廣播,只能用作目的地址,發到該地址的數據包不能轉發到源地址所在網絡之外。{net-id,-1}
: 直接廣播到指定的網絡上。只能用作目的地址。{net-id,subnet-id,-1}
: 直接廣播到指定網絡的指定子網絡上。只用作目的地址。{net-id,-1,-1}
: 直接廣播到指定網絡的所有子網絡上。只能用作目的地址。{127,}
: 即網絡號為 127 的任意 ip 地址。都是內部主機回環地址(loopback),永遠都不能出現在主機外部的網絡中。具體來說,特殊的IP地址,主要是以下這些:
0.0.0.0
:
嚴格說來,0.0.0.0 已經不是一個真正意義上的IP地址了。它表示的是這樣一個集合:所有不清楚的主機和目的網絡。這裡的"不清楚"是指在本機的路由表裡沒有特定條目指明如何到達。對本機來說,它就是一個"收容所",所有不認識的"三無"人員,一律送進去。如果你在網絡設置中設置了缺省網關,那麼 Windows 系統會自動產生一個目的地址為 0.0.0.0 的缺省路由。
255.255.255.255
:
限制廣播地址。對本機來說,這個地址指本網段內(同一廣播域)的所有主機。如果翻譯成人類的語言,應該是這樣:"這個房間裡的所有人都注意了!",這個地址不能被路由器轉發。
127.0.0.1
:
本機地址,主要用於測試。用漢語表示,就是"我自己"。在 Windows 系統中,這個地址有一個別名"Localhost"。尋址這樣一個地址,是不能把它發到網絡接口的。除非出錯,否則在傳輸介質上永遠不應該出現目的地址為 "127.0.0.1" 的數據包。
224.0.0.1
:
組播地址,注意它和廣播的區別。從 224.0.0.0 到 239.255.255.255 都是這樣的地址。224.0.0.1 特指所有主機,224.0.0.2 特指所有路由器。這樣的地址多用於一些特定的程序以及多媒體程序。如果你的主機開啟了 IRDP (Internet路由發現協議,使用組播功能)功能,那麼你的主機路由表中應該有這樣一條路由。
169.254.xx
:
如果你的主機使用了 DHCP 功能自動獲得一個IP地址,那麼當你的 DHCP 服務器發生故障,或響應時間太長而超出了一個系統規定的時間,Windows 系統會為你分配這樣一個地址。如果你發現你的主機IP地址是一個諸如此類的地址,很不幸,十有八九是你的網絡不能正常運行了。
10.xxx
、172.16.xx~172.31.xx
、192.168.xx
:
私有地址,這些地址被大量用於企業內部網絡中。一些寬帶路由器,也往往使用 192.168.1.1 作為缺省地址。私有網絡由於不與外部互連,因而可能使用隨意的IP地址。保留這樣的地址供其使用是為了避免以後接入公網時引起地址混亂。使用私有地址的私有網絡在接入 Internet 時,要使用地址翻譯(NAT),將私有地址翻譯成公用合法地址。在 Internet 上,這類地址是不能出現的。
通過上節基礎知識的回顧,我們回到正題:127.0.0.1 與 0.0.0.0 地址的區別是什麼?
我們先來看下共同點:
接下來我們分別看下這兩個地址的具體作用,就一目了解了。
IPV4中,0.0.0.0 地址被用於表示一個無效的、未知的或者不可用的目標:
127.0.0.1 屬於 {127,}
集合中的一個,而所有網絡號為 127 的地址都被稱之為回環地址,所以回環地址不等於 127.0.0.1,它們是包含
關係,即回環地址包含 127.0.0.1。
ping 127.0.0.1
測試某台機器上的網絡設備,操作系統或者 TCP/IP 實現是否工作正常。所有發往該類地址的數據包都應該被 loop back。
相比 127.0.0.1,localhost 具有更多的意義。
localhost 是個域名,而不是一個ip地址。之所以我們經常把 localhost 與 127.0.0.1 認為是同一個是因為我們使用的大多數電腦上都講 localhost 指向了 127.0.0.1 這個地址。
在 ubuntu 系統中,/etc/hosts
文件中都會有如下內容:
127.0.0.1 localhost
127.0.1.1 52im-aliyun
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
上面第一行是幾乎每台電腦上都會有的默認配置。但是 localhost 的意義並不局限於 127.0.0.1。
localhost 是一個域名,用於指代 this computer 或者 this host,可以用它來獲取運行在本機上的網絡服務。
在大多數系統中,localhost 被指向了 IPV4 的 127.0.0.1
和 IPV6 的::1
:
127.0.0.1 localhost
::1 localhost
所以,在使用的時候要注意確認IPV4還是IPV6。
127.0.0.1
是一個環回地址,並不表示"本機"。
0.0.0.0
才是真正表示"本網絡中的本機"。
在實際應用中:一般我們在服務端綁定端口的時候可以選擇綁定到 0.0.0.0
,這樣我的服務訪問方就可以通過我的多個ip地址訪問我的服務。
比如:我有一台服務器,一個外網地址A,一個內網地址B,如果我綁定的端口指定了 0.0.0.0
,那麼通過內網地址或外網地址都可以訪問我的應用。
但是如果我只綁定了內網地址,那麼通過外網地址就不能訪問。所以如果綁定 0.0.0.0
,也有一定安全隱患,對於只需要內網訪問的服務,可以只綁定內網地址。
作者:Wayne (偉恩)
連結:https://wayne-blog.com/
來源:Wayne's blog | 偉恩的部落格 | 技術博客
很基礎的東西,寫的很詳細,推一下!
BTW , 127.0.0.1 和 0.0.0.0 我面試時還真的被考過
當然~ 我當時是有寫出來的 XD
微不足道的基礎,在面試時顯得格外的重要~